<?php

/**
 * This file is part of the CodeIgniter 4 framework.
 *
 * (c) CodeIgniter Foundation <admin@codeigniter.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace CodeIgniter\Commands\Generators;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use CodeIgniter\CLI\GeneratorTrait;

/**
 * Generates a skeleton migration file.
 */
class MigrationGenerator extends BaseCommand
{
	use GeneratorTrait;

	/**
	 * The Command's Group
	 *
	 * @var string
	 */
	protected $group = 'Generators';

	/**
	 * The Command's Name
	 *
	 * @var string
	 */
	protected $name = 'make:migration';

	/**
	 * The Command's Description
	 *
	 * @var string
	 */
	protected $description = 'Generates a new migration file.';

	/**
	 * The Command's Usage
	 *
	 * @var string
	 */
	protected $usage = 'make:migration <name> [options]';

	/**
	 * The Command's Arguments
	 *
	 * @var array
	 */
	protected $arguments = [
		'name' => 'The migration class name.',
	];

	/**
	 * The Command's Options
	 *
	 * @var array
	 */
	protected $options = [
		'--session'   => 'Generates the migration file for database sessions.',
		'--table'     => 'Table name to use for database sessions. Default: "ci_sessions".',
		'--dbgroup'   => 'Database group to use for database sessions. Default: "default".',
		'--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".',
		'--suffix'    => 'Append the component title to the class name (e.g. User => UserMigration).',
	];

	/**
	 * Actually execute a command.
	 *
	 * @param array $params
	 */
	public function run(array $params)
	{
		$this->component = 'Migration';
		$this->directory = 'Database\Migrations';
		$this->template  = 'migration.tpl.php';

		if (array_key_exists('session', $params) || CLI::getOption('session'))
		{
			$table     = $params['table'] ?? CLI::getOption('table') ?? 'ci_sessions';
			$params[0] = "_create_{$table}_table";
		}

		$this->classNameLang = 'CLI.generator.className.migration';
		$this->execute($params);
	}

	/**
	 * Prepare options and do the necessary replacements.
	 *
	 * @param string $class
	 *
	 * @return string
	 */
	protected function prepare(string $class): string
	{
		$data['session'] = false;

		if ($this->getOption('session'))
		{
			$table   = $this->getOption('table');
			$DBGroup = $this->getOption('dbgroup');

			$data['session'] = true;
			$data['table']   = is_string($table) ? $table : 'ci_sessions';
			$data['DBGroup'] = is_string($DBGroup) ? $DBGroup : 'default';
			$data['matchIP'] = config('App')->sessionMatchIP;
		}

		return $this->parseTemplate($class, [], [], $data);
	}

	/**
	 * Change file basename before saving.
	 *
	 * @param string $filename
	 *
	 * @return string
	 */
	protected function basename(string $filename): string
	{
		return gmdate(config('Migrations')->timestampFormat) . basename($filename);
	}
}
